<?php
declare(strict_types=1);

namespace Zyucv7\Core\Autoloader;

use Zyucv7\Core\Autoloader\IFinder;

/**
 * 自动加载管理器
 */
class Manager
{
    /**
     * 查找器列表
     * @var IFinder[]
     */
    private array $finders = [];

    /**
     * 添加一个查找器
     *
     * @param IFinder $finder
     * @return void
     */
    public function addFinder(IFinder $finder): void
    {
        $this->finders[] = $finder;
    }

    /**
     * 注册到SPL自动加载栈
     *
     * @param bool $prepend 是否置于栈顶，优先执行
     * @return void
     */
    public function register(bool $prepend = false): void
    {
        spl_autoload_register([$this, 'loadClass'], true, $prepend);
    }

    /**
     * 自动加载的核心方法
     *
     * @param string $className
     * @return bool
     */
    public function loadClass(string $className): bool
    {
        // 遍历所有查找器
        foreach ($this->finders as $finder) {
            $file = $finder->findFile($className);
            if ($file !== null) {
                require_once $file;
                return true;
            }
        }

        return false;
    }
}
